Software development has emerged as one of the most rapidly changing areas of technological advancement. From room-sized computing systems of yesterday to the high performance desktop or portable machines of today, development platforms along with associated development environments continually change in response to technological innovation. One area where these changes are readily apparent is in the software development industry, wherein computer systems designers and architects often have a plurality of tools at their disposal in order to create a desired application. These tools can include hardware assets such as personal computers, emulators, traffic or network analyzers, and other instruments to aid in software component design. Software development tools can be even more numerous. For example, such tools can include development platforms, compilers, linkers, assemblers, debuggers, modelers, and other tools in addition to a plurality of different programming language environments that may be required for various design problems.
Each of the respective tools described above can include a plurality of differing functionality. Thus, in order to become proficient with a given tool, programming language, or development environment, one must become acclimated with the technical terminology associated with the respective tool in order to properly utilize and exploit underlying features of the tool. In one example, many operating system environments offer software packages known as development platforms or “studios.” These platforms may also include support for various programming languages such as Visual Basic, C++, Java, C#, J#, and XML to name but a few examples.
Along with which language is selected for development, software designers often have to consider and design for a particular runtime environment. For example, in previous generation operating systems, objects were responsible for managing object lifetimes such as via techniques known as reference counting. Object communications were often achieved via such models as the Component Object Model (COM). Newer virtual machine environments can now automatically manage object lifetime such as through employment of a system garbage collector to reclaim an object that is no longer being accessed. These systems can also more seamlessly integrate with Web type developments such as via XML protocols, Simple Object Access Protocols (SOAP), and Web Services Description Language (WSDL), for example.
Other design issues involve runtime code generation considerations that may include aspects relating to Just-in-Time (JIT) compilation techniques. Such techniques can include late bound calls that are found in languages such as Visual Basic, ECMAScript, Python, Perl, PHP, Scheme, Ruby, and so forth. In these languages, the types of a receiver and arguments of a method call are generally not known statically, whereas managed system method call instructions (e.g., call, callvirt, ldftn, ldvrtftn) require respective static types of the method arguments and result. Hence, a method dispatch is performed dynamically based on the runtime types of the receiver, actual arguments, and the static name of the method. This interpretative layer is one of the main reasons that late bound languages do not perform as well as statically typed languages. As can be appreciated, the above tools, languages, design, and associated runtime considerations are too numerous to outline. Thus, forming an understanding of all the various components and interactions in a typical development environment remains a constant and complicated challenge—even for the most experienced of designers.
In view of the above, with the increasing abstraction of high-level programming languages and the trend towards language-independent objects that allow frequently-needed functionality to be readily accessed and re-used, it is becoming more difficult to measure and to improve the quality of technical documentation associated with software development processes.